macro_rules! create_function {
//     此宏接受一个`ident`指示符表示的参数，并创建一个名为`$func_name`的函数
//     `ident`指示符用于变量名或函数名
    ($func_name:ident) => (
        fn $func_name() {
        //     `stringify!`宏把`ident`转换为其对应的字符串
            println!("You called \"{}()\"", stringify!($func_name))
        }
    )
}
// 借助上述宏来创建名为`foo`和`bar`的函数
create_function!(foo);
create_function!(bar);

macro_rules! print_result {
//     此宏接受一个`expr`类型的表达式，并将它作为字符串，连同其结果一起打印出来
//     `expr`指示符表示表达式
    ($expr:expr) => (
    //     `stringify!`把表达式*原样*转换成一个字符串
        println!("{} = {}",
                 stringify!($expr),$expr)
        // println!("{:?} = {:?}",
        //          stringify!($expr),$expr)

    )
}
fn main() {
    foo();
    bar();

    print_result!("a".to_owned() + "b");
    print_result!(1 + 2);
    print_result!(1u32 + 2 * 3);

//     代码块也是一个表达式
    print_result!(
        {
            let x = 1u32;
            x * x + 2 * x - 1
        });
}
